GX 05 - QuickDraw GX Ç…ÇÊÇÈ EPS ÇÃÉTÉ|Å[Ég

(95 îN 5 åé 1 ì˙): çXêV

Q: QuickDraw GX Çégǡǃ EPS ÉtÉ@ÉCÉãÇÉTÉ|Å[ÉgÇ∑ÇÈÇΩÇflÇÃê≥ǵǢï˚ñ@Çã≥ǶǃÇ≠ÇæÇ≥Ç¢ÅB
QuickDraw ÉvÉåÉrÉÖÅ[Ç GX ÉVÉFÉCÉvÇ…ïœä∑ǵÅAPostScript ÉRÅ[ÉhÇä‹ÇfiÉ^ÉOÇÉAÉ^ÉbÉ`Ç∑ÇÍnjǢǢÇΔévǧÇÃÇ≈Ç∑Ç™ÅAǪÇÃåãâ ÅAàÛç¸ÇçsǧÇΔÅAPostScript ÉCÉÅÅ[ÉWÇÃìVínÇ™ãtDžǻǡǃǵNjǢNjÇ∑ÅBDZÇÍÇÕÅAGX ÇΔ PostScript Ç≈àÛç¸ÇÃå¸Ç´Ç™ãtDžǻǡǃǢÇÈDZÇΔÇ™å¥àˆÇæÇΔévǢNjÇ∑ÅBDZÇÃñ‚ëËÇâåàÇ∑ÇÈÇΩÇflÇ…ÅAPostScript ÇÃÉRÅ[ÉhÇèCê≥Ç∑ÇÈïKóvÇÕdžÇËÇ‹Ç∑Ç©ÅB

A: PostScript ÇÃÉVÉmÉjÉÄÇégǧÇΔÇ´Ç…ÇÕïKóvÇ≈Ç∑ÅBì¡Ç…ÅAQD ÇÃç¿ïWãÛä‘Ççló∂Ç…ì¸ÇÍǃǮÇ≠ïKóvǙdžÇËÇ‹Ç∑ÅBQD Ç≈ÇÕÅA0,0 ÇÉyÅ[ÉWÇÃç∂è„ã˜ÇΔíËã`ǵǃǢNjÇ∑Ç™ÅAPostScript Ç≈ÇÕÅA0,0 Çç∂â∫ã˜ÇÃç¿ïWÇΔíËã`ǵǃǢNjÇ∑ÅBDZÇÃDZÇΔDžǬǢǃÇÕÅAÅuQuickdraw GX PrintingÅvÉ}ÉjÉÖÉAÉãÇà 4Å`13 ÉyÅ[ÉWÇ…è⁄ǵǢâê‡Ç™èëÇ©ÇÍǃǢNjÇ∑ÅB

DZÇÃñ‚ëËÇàµÇ§Ç…ÇÕÅAëΩêîÇÃï˚ñ@ǙdžÇËÇ‹Ç∑ÅBǪÇà 1 ǬDžÅAtranslate ÇΔ scale ÇégǡǃÅAç¿ïWånÇêÿÇËë÷ǶÇÈÇΔǢǧï˚ñ@ǙdžÇËÇ‹Ç∑ÅBÇΩÇΔǶnjÅAÉyÅ[ÉWÇÃècÇ™ 760 ÉsÉNÉZÉãÇÃèÍçáÇÕÅAéüÇÃÉRÅ[ÉhÇégǡǃÅA0,0 ÇÉyÅ[ÉWÇÃç∂â∫ã˜Ç…ïœä∑Ç≈Ç´Ç‹Ç∑ÅB

0 760 translate
1 -1 scale
newpath
DZǧÇ∑ÇÍÇŒÅAécÇËÇà PostScript ÉRÅ[ÉhÇÕÅAǪÇÃNjNjëóêMÇ≈Ç´Ç‹Ç∑ÅBÇΩÇæÇµÅAGX ÉIÉuÉWÉFÉNÉgÇï`âÊÇ∑ÇÈëOÇ…ÇÕÅAtranslate Ç®ÇÊÇ— scale ââéZÇÃå¯â Çå≥Ç…ñflÇ∑DZÇΔÇñYÇÍǻǢÇ≈Ç≠ÇæÇ≥Ç¢ÅBǪǧǵǻǢÇΔÅAGX ÉIÉuÉWÉFÉNÉgÇÃìVínÇÕãtDžǻǡǃǵNjǢNjÇ∑ÅB

Q: Ç≤éwìEÇÃï˚ñ@ÇÕÅAÉÜÅ[ÉUÇ… EPS ÇÃÉGÉNÉXÉ|Å[ÉgÇÇ≥ÇπǻǢDZÇΔÇëOíÒÇ…Ç∑ÇÍÇŒÅAÇΩǵǩDžëΩÇ≠ÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇëŒè€Ç… QuickDraw GX Ç≈ EPS ÇÉTÉ|Å[ÉgÇ∑ÇÈï˚ñ@ÇΔǵǃê\ǵï™Ç†ÇËÇ‹ÇπÇÒÅBǵǩǵÅAEPS Çà íuÇ…àÀë∂ǵǻǢÉVÉFÉCÉv (íPí≤âªÇ≥ÇÍÇΩÉsÉNÉ`ÉÉÅEÉVÉFÉCÉvÇÃàÍïîÇΔǵǃ) ÇΔǵǃÉTÉ|Å[ÉgÇ∑ÇÈïKóvǙdžÇÈÇÃÇ≈Ç∑ÅBéüÇ…é¶Ç∑ï˚ñ@ÇÕÅAÉyÅ[ÉWÇÃçÇÇ≥Ç™ÇÌǩǡǃǢÇÈDZÇΔÇëOíÒDžǵǃǢÇÈÇΩÇflÅAÉAÉvÉäÉPÅ[ÉVÉáÉìä‘ (ÇΩÇΔǶnjÅA'qdgx' ÉNÉäÉbÉvÉ{Å[ÉhÇΔÇ¢Ç≠ǬǩÇÃÉtÉ@ÉCÉãå`éÆÇÃä‘) Ç≈ÉfÅ[É^åä∑ÇçsǧÇΔÇ´Ç…ÇÕǧNjÇ≠ìÆçÏǵNjÇπÇÒÅB

EPS ÉvÉåÉrÉÖÅ[ÇÉsÉNÉ`ÉÉÅEÉVÉFÉCÉvÇÃì‡ïîÇ…ïïì¸ÇµÇ‹ÇµÇΩÅBEPS ÉVÉmÉjÉÄÅEÉ^ÉOÇÕÉsÉNÉ`ÉÉÅEÉVÉFÉCÉvÇ…ÉAÉ^ÉbÉ`ǵÅAècï˚å¸ÇîΩì]Ç∑ÇÈÉ}ÉbÉsÉìÉOÇÕÅAÉvÉåÉrÉÖÅ[ÅEÉVÉFÉCÉvÇΔÉsÉNÉ`ÉÉÅEÉVÉFÉCÉvǪÇÃLJÇÃÇÃóºï˚Ç…ìKópǵNjǵÇΩÅBPostScript ÇÕ 1 ìxècï˚å¸ÇÃîΩì]ÇçsÇ¢ (DZÇÍÇ≈ê≥ǵÇ≠àÛç¸Ç≈Ç´ÇÈ)ÅAïïì¸ÇµÇΩÉvÉåÉrÉÖÅ[ÅEÉVÉFÉCÉvÇÕ 2 ìxÇΔècï˚å¸ÇÃîΩì]ÇçsÇ¶ÇŒÇ¢Ç¢ÇæÇÎǧ (DZÇÍÇ≈ê≥ǵÇ≠âÊñ Ç…ï\é¶Ç≈Ç´ÇÈ)ÅAÇΔçlǶÇΩÇΩÇflÇ≈Ç∑ÅBǵǩǵǪÇÃåãâ ÅAÉvÉåÉrÉÖÅ[ÅEÉVÉFÉCÉvÇÕê≥ǵÇ≠âÊñ Ç…ï\é¶Ç≥ÇÍÇΩLJÇÃÇÃÅAPostScript ÇÕê≥ǵǢèÍèäÇ…àÛç¸Ç≥ÇÍÇ‹ÇπÇÒÇ≈ǵÇΩÅBà íuÇ…àÀë∂ǵǻǢï˚ñ@Ç≈ÅADZÇÃñ‚ëËÇǧNjÇ≠èàóùÇ≈Ç´ÇÈï˚ñ@Çã≥ǶǃÇ≠ÇæÇ≥Ç¢ÅB

A: Apple Ç≈ÇÕÅAEPStoShape ÇΔǢǧä÷êîÇíÒãüǵǃǢNjÇ∑ÅBDZÇÃä÷êîÇÕÅAEPS Ç GX ÉVÉFÉCÉvÇ…ÉGÉìÉLÉÉÉvÉVÉÖÉåÅ[ÉgÇ∑ÇÈï˚ñ@Çà 1 ǬÇÃé¿ó·ÇΔǻǡǃǢNjÇ∑ÅBDZDZÇ≈ê‡ñæÇ∑ÇÈÉTÉìÉvÉãÇÕîÒèÌÇ…ä»íPǻLJÇÃÇ»ÇÃÇ≈ÅAé¿ç€ÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈égópÇ∑ÇÈÇΔÇ´Ç…ÇÕÅAìKêÿÇ»ägí£ÇçsǧïKóvǙdžÇËÇ‹Ç∑ÅB

ÉTÉìÉvÉãÅEÉRÅ[ÉhÇ™àµÇ§Ç±ÇΔÇÃÇ≈ǴǻǢÉPÅ[ÉXÇ™ 2 ǬdžÇËÇ‹Ç∑ÅB

1. Ç‹Ç∏ÅAÉTÉCÉYÇÃëÂÇ´Ç» EPS ÉtÉ@ÉCÉãÇÃèÍçáÇ≈Ç∑ÅBEPStoShape ÉãÅ[É`ÉìÇ≈ÇÕÅAEPS ÉtÉ@ÉCÉãëSëÃÇ 1 ǬÇÃÉnÉìÉhÉãÇÃíÜÇ…ì«Ç›çûǛNjÇ∑ÅBǪǵǃÅADZÇÃÉnÉìÉhÉãÇ™ÅA'post' ÉRÉåÉNÉVÉáÉìÇΔǵǃÉVÉFÉCÉvÇ…í«â¡Ç≥ÇÍÇ‹Ç∑ÅBDZÇÃÉãÅ[É`ÉìÇÕÅAÉTÉCÉYÇÃè¨Ç≥Ç»ÉTÉìÉvÉãÅEÉtÉ@ÉCÉãÇ≈ÇÕê≥èÌÇ…ìÆçÏǵNjÇ∑Ç™ÅAÉTÉCÉYÇÃëÂÇ´Ç» EPS ÉtÉ@ÉCÉãÇÉTÉ|Å[ÉgÇ∑ÇÈÇΩÇflÇ…ÇÕÅADZÇÃÉãÅ[É`ÉìÇèCê≥ǵǃÅAÉtÉ@ÉCÉãÇï°êîÇÃÉZÉNÉVÉáÉìÇ…ï™ÇØÇƒì«Ç›çûÇ›ÅAï°êîÇÃè¨Ç≥Ç»ÉRÉåÉNÉVÉáÉìÇÉVÉFÉCÉvÇ…í«â¡Ç≈Ç´ÇÈÇÊǧDžÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBDZÇÍÇ…ÇÊÇËÅAàÛç¸éûÇ…ïKóvÇ»ÉÅÉÇÉäóeó Ç™è≠Ç»Ç≠Ç»ÇËÇ‹Ç∑ÅB
2. EPStoShape ä÷êîÇÕÅAEPS ÉtÉ@ÉCÉãÇÃíÜÇ≈ %%BoundingBox ÉRÉÅÉìÉgÇåüçıǵÅAèëófi/ÉVÉFÉCÉvÇÃÉTÉCÉYÇîªíËǵNjÇ∑ÅBDZÇÃÉRÉÅÉìÉgÇÕÅAí èÌÅAé¿ç€ÇÃèëófiÇÃÉfÅ[É^ÇÃíºëOÇ…íuÇ©ÇÍǃǮÇËÅAã´äEÉ{ÉbÉNÉXÇÃè„í[ÅAç∂í[ÅAâ∫í[ÅAâEí[Çï\Ç∑ 4 ǬÇÃêÆêîǙǪÇÃå„Ç…ë±Ç´Ç‹Ç∑ÅBÇΩÇæÇµÅAEPS ÉtÉ@ÉCÉãÇÃèëÇ´èoǵÇÇÊÇËóeà’Ç…Ç∑ÇÈÇΩÇflÅADZÇÃÉRÉÅÉìÉgÇÃèëéÆÇÕägí£Ç≥ÇÍǃǢNjÇ∑ÅBåªç›Ç≈ÇÕÅAéüÇÃÇÊǧDžèëÇ≠DZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅB
%% BoundingBox: (atend)
<é ¿ç€ÇÃèëófiÇÃÉfÅ[É^>;
%% BoundingBox: 0 0 10 10
DZDZÇ≈ÅA'(atend)' ÇÕÅAé¿ç€ÇÃã´äEÉ{ÉbÉNÉXÇ™èëófiÉfÅ[É^ÇÃññîˆÇ…džÇÈDZÇΔÇÉäÅ[É_Ç…éwé¶ÇµÇ‹Ç∑ÅBEPStoShape ä÷êîÇ≈ÇÕÅAç≈èâÇà BoundingBox ÉRÉÅÉìÉgÇ… 4 ǬÇÃç¿ïWÇ™ä‹Ç‹ÇÍǃǢÇÈDZÇΔÇëOíÒDžǵǃǮÇËÅAç¿ïWÇÃë„ÇÌÇËÇ… (atend) ÉLÅ[ÉèÅ[ÉhÇ™åüèoÇ≥ÇÍÇÈÇΔÅAà”ñ°ÇÃǻǢ PostScript ÉRÅ[ÉhÇê∂ê¨ÇµÇƒÇµÇ‹Ç¢Ç‹Ç∑ÅBDZÇÃÉãÅ[É`ÉìÇé¿ç€ÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈égǧDžÇÕÅA(atend) ÉRÉìÉXÉgÉâÉNÉgÇÉ`ÉFÉbÉNǵÅAǪÇÍÇ™åüèoÇ≥ÇÍÇΩèÍçáÇÕ 2 î‘ñ⁄Çà BoundingBox ÉRÉÅÉìÉgÇåüçıÇ∑ÇÈÇÊǧDžÅAÉãÅ[É`ÉìÇèCê≥ǵǃÇ≠ÇæÇ≥Ç¢ÅB


DZÇÍÇÁ 2 ǬÇÃèCê≥ÇÕÅAî‰ärìIä»íPÇ…ÉCÉìÉvÉäÉÅÉìÉgÇ≈Ç´ÇÈÇÕÇ∏Ç≈Ç∑ÅB

ÉãÅ[É`Éì: EPSFileToShape

EPS ÉtÉ@ÉCÉãÇì«Ç›çûÇ›ÅAǪÇÃäOïîÇ…ÉVÉFÉCÉvÇçÏê¨ÇµÇ‹Ç∑ÅBǪÇÃíÜÇ… PICT ÉäÉ\Å[ÉXÇ™ä‹Ç‹ÇÍǃǢÇÈèÍçáÅAǪÇÍÇÕ Skia Ç…ïœä∑Ç≥ÇÍÇ‹Ç∑ÅBÇ‹ÇΩÅAPICT ÉäÉ\Å[ÉXÇ™ä‹Ç‹ÇÍǃǢǻǢèÍçáÅAéläpå`ÇÃÉVÉFÉCÉvÇÕÅA0,0 ÇãNì_ÇΔǵǃÅAEPS Çà BoundingBox:: ÉRÉÅÉìÉgÇ©ÇÁìæÇÁÇÍÇΩã´äEÉ{ÉbÉNÉXÇÃïùÇΔçÇÇ≥Ç…Ç»ÇËÇ‹Ç∑ÅB

Ç¢Ç∏ÇÍÇÃÉPÅ[ÉXÇ≈LJÅAEPS ÉtÉ@ÉCÉãÇÕÅA'post' É^ÉOÅEÉVÉmÉjÉÄÇΔÇΔLJDžÉVÉFÉCÉvÇ…ÉAÉ^ÉbÉ`Ç≥ÇÍÇ‹Ç∑ÅB

DZÇÃÇÊǧDžǵǃí«â¡Çà PostScript Ç™ÉAÉ^ÉbÉ`Ç≥ÇÍÅASkia-PostScript Imaging System ÇâÓǵǃàÛç¸ÇçsǧÇΔǴDžLJÅAPostScript Ç™ÉVÉFÉCÉvÇÃïœå`ÇåoóRǵǃìKêÿÇ…ÉåÉìÉ_ÉäÉìÉOÇçsǶÇÈÇÊǧDžǻÇËÇ‹Ç∑ (Ç‡ÇøÇÎÇÒÅADZDZÇ≈è⁄ǵǢDZÇΔÇê‡ñæÇ∑ÇÈÇÌÇØÇ…ÇÕǢǴNjÇπÇÒÇ™)ÅB

DZÇÃÇΩÇflÇÃÉAÉãÉSÉäÉYÉÄÇÕÅAÅwPostScript Language Reference ManualÅx(2nd edition) Çà 724 ÉyÅ[ÉWÇ…ãLç⁄Ç≥ÇÍǃǢNjÇ∑ÅB

ÉXÉeÉbÉv 1.
left bottom translate %% DZDZÇ≈ÅAleftÅAbottom ÇÕÅAQD ÉVÉFÉCÉvÇÃã´äEÇà left ÇΔ bottom
ÉXÉeÉbÉv 2.
1 -1 scale %% Skia Ç©ÇÁ PostScript ãÛä‘Ç…ñflÇÈ
ÉXÉeÉbÉv 3.
-x1 -y1 translate %% å¥ì_Ç EPS ã´äEÉ{ÉbÉNÉXÇÃç∂â∫ã˜Ç…íuÇ≠
DZÇÃÉãÅ[É`ÉìÇ≈ÇÕÅAEPS ÉfÅ[É^Ç‚ÉoÅ[ÉWÉáÉìÇÃóLå¯ê´ÇÉ`ÉFÉbÉNǵNjÇπÇÒÅBPostScript Ç™ã´äEÉ{ÉbÉNÉXÇÃÉRÉÅÉìÉgÇä‹ÇfióLå¯Ç» EPS Ç≈džÇÈDZÇΔÇëOíÒDžǵǃǢNjÇ∑ÅB

/******************************************************/

gxShape EPSFileToShape(Str255 fName, short vRefNum)
{
    OSErr			status;
    PicHandle			thePict;
    Rect			theRect;
    Point			patStretch = {1,1};
    gxShape			theShape = nil;
    short			refNum;
    gxTag			synTag;
    long			size;
    Handle			hPsData;
    long			startComment, endComment;
    Str32			num1;
    char			tagString[300];
    long			tagSize, pieceSize;

    gxTranslationStatistic	seanStats;

    /** PostScript ÉfÅ[É^ÇéÊìæ **/

    status = FSOpen(fName, vRefNum, &refNum);
    ncheck(status);

    GetEOF(refNum, &size);
    hPsData = NewHandle(size);
    HLock(hPsData);


    /** EPS ÉtÉ@ÉCÉãëSëÃÇì«Ç›çûÇfi **/
    status = FSRead(refNum, &size, *hPsData);
    ncheck(status);

    FSClose(refNum);

    /** ã´äEÉ{ÉbÉNÉXÇÃÉRÉÅÉìÉgÇåüçı (êîílÇÃÇ›) **/

    startComment = Munger(hPsData, 0, "%%BoundingBox:", 14, nil, 0) + 14;
    endComment = Munger(hPsData , startComment, "\n", 1, nil, 0);

    refNum = OpenRFPerm(fName, vRefNum, 0);

    thePict = (PicHandle)GetResource('PICT', 256);
    if (thePict != nil) {

            theRect = (*thePict)->picFrame;

            theShape = GXNewShape(gxPictureType);

            (void) GXConvertPICTToShape(thePict, gxDefaultOptionsTranslation,
					&theRect, &theRect, patStretch,
					theShape, &seanStats);

            status = GXGetGraphicsError(nil);

            ncheck(status);

            ReleaseResource((Handle)thePict);

    } else {

            float            x1, y1, x2, y2;
            gxRectangle      theRectangle;

            sscanf(*hPsData + startComment, "%f %f %f %f", &x1, &y1, &x2, &y2);
            theRectangle.top = 0;
            theRectangle.left = 0;
            theRectangle.right = X2Fix(x2 - x1);
            theRectangle.bottom = X2Fix(y2 - y1);

            /** ñÑÇflçûÇ› PostScript ÇÃå¥ì_ïœä∑ÇÃÇΩÇflÇ… 
            		QuickDraw ÇÃéläpå`Ç™ïKóv **/

            theRect.top = 0;
            theRect.left = 0;
            theRect.bottom= theRectangle.bottom >> 16;
            theRect.right = theRectangle.right >> 16;

            theShape = GXNewRectangle(&theRectangle);

    }//end if

    CloseResFile(refNum);


    /** QuickDraw éläpå`Çà Left Bottom Ç…ïœä∑ **/

    tagSize = 0;
    NumToString(theRect.left, num1);
    num1[(unsigned char)num1[0] + 1] = ' ';
    pieceSize = (unsigned char)num1[0] + 1;
    BlockMove(&(num1[1]), tagString, pieceSize);
    tagSize += pieceSize;

    NumToString(theRect.bottom, num1);
    pieceSize = (unsigned char)num1[0];
    BlockMove(&(num1[1]), tagString + tagSize, pieceSize);
    tagSize += pieceSize;

    BlockMove(" translate\n", tagString + tagSize, 11);
    tagSize += 11;

    /** ç¿ïWé≤ÇîΩì] **/
    BlockMove(" 1 -1 scale\n", tagString + tagSize, 12);
    tagSize += 12;

    synTag = GXNewTag( gxPostScriptTag, tagSize, tagString);
    GXSetShapeTags(theShape, gxPostScriptTag, 0, 0, 1, &synTag);
    GXDisposeTag(synTag);

    /**  -(LLx) -(LLy) Ç…ïœä∑ **/

    // ÉIÉyÉâÉìÉh•ÉXÉ^ÉbÉNè„ÇÃÉIÉyÉâÉìÉh•ÉRÉÅÉìÉg
    ï∂éöóÒÇ©ÇÁìæÇΩ 4 ǬÇÃÉ{ÉbÉNÉXî‘çÜ
    synTag = GXNewTag( gxPostScriptTag, endComment - startComment + 1, 
    			*hPsData + startComment);
    GXSetShapeTags(theShape, gxPostScriptTag, 0, 0, 1, &synTag);
    GXDisposeTag(synTag);

    // å„Çà 2 ǬÇÉ|ÉbÉvǵÅAç≈èâÇà 2 ǬÇïâÇÃêîÇ…ïœä∑
    synTag  = GXNewTag( gxPostScriptTag, 36, 
    			"pop pop neg exch neg exch translate\n");
    GXSetShapeTags(theShape, gxPostScriptTag, 0, 0, 1, &synTag);
    GXDisposeTag(synTag);


    /** PostScript ÉVÉmÉjÉÄñ{ëà **/

    synTag = GXNewTag( gxPostScriptTag, size, *hPsData);
    GXSetShapeTags(theShape, gxPostScriptTag, 0, 0, 1, &synTag);
    GXDisposeTag(synTag);

    DisposHandle(hPsData);

    check(theShape);
    return(theShape);

}//EPSFileToShape


[ Technical Q&A's : QuickDraw GX : GX Graphics : GX05 ]